package cn.good.yan;

import cn.good.yan.mapper.BillMapper;
import cn.good.yan.mapper.EmpMapper;
import cn.good.yan.pojo.Bill;
import cn.good.yan.pojo.Emp;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;


/**
 * 测试 4
 *  1 乐观锁
 *  2 乐观锁 - 优化代码
 *  3 测试通用枚举
 *  4 MyBatisX插件 - 需要在idea 安装
 *  
 * @author shengren.yan
 * @create 2023-09-23
 */
@SpringBootTest
public class test4Other {

    @Autowired
    private BillMapper billMapper;

    /**
     * 1 乐观锁
     *      乐观锁：每次修改，会检查是否被别人修改，如果被修改，重新再获取值进行修改
     *      悲观锁：每次操作，等A执行完，B再执行
     *      底层：就是表中增加一个字段（版本号）
     *            每次修改前，取出该版本号  select * ,(版本号) from 表  where id=1;
     *            更新时，update 表 set 字段1=新值 , (版本号) =(版本号) +1 where id=1 and (版本号) = 查询的版本号
     */
    @Test
    public void test1(){
        // 1. 没有乐观锁 - 引出的问题
        // 事务A ，查询的sQL
        Bill bill = billMapper.selectById(6L);
        // 事务B ，查询的sQL
        Bill bill2 = billMapper.selectById(6L);

        // 事务A 进行修改值为 + 50 ， 默认BillNum是 0
        bill.setBillNum(bill.getBillNum() + 50);
        billMapper.updateById(bill);

        // 事务B 进行修改值为 - 10 ， 默认BillNum是 0
        bill2.setBillNum(bill2.getBillNum() - 10);
        billMapper.updateById(bill2);

        // 最终的数据 ， 是 -10 ， 实际想要的结果：40
        // 如： 增加乐观锁 之后，最终结果 就是 40
        Bill bill3 = billMapper.selectById(6L);
        System.out.println(bill3.getBillNum());
    }

    // 2 乐观锁 - 优化代码
    @Test
    public void test2(){
        // 1. 没有乐观锁 - 引出的问题
        // 事务A ，查询的sQL
        Bill bill = billMapper.selectById(6L);
        // 事务B ，查询的sQL
        Bill bill2 = billMapper.selectById(6L);

        // 事务A 进行修改值为 + 50 ， 默认BillNum是 0
        bill.setBillNum(bill.getBillNum() + 50);
        billMapper.updateById(bill);

        // 事务B 进行修改值为 - 10 ， 默认BillNum是 0
        bill2.setBillNum(bill2.getBillNum() - 10);
        int result = billMapper.updateById(bill2);
        if (result == 0) {
            // 操作失败，重试 - 此时这里可以写成 自旋的方式
            Bill b = billMapper.selectById(16L);
            b.setMoney(b.getMoney() - 10);
            billMapper.updateById(b);
        }

        // 最终的数据 ， 是 -10 ， 实际想要的结果：40
        // 如： 增加乐观锁 之后，最终结果 就是 40
        Bill bill3 = billMapper.selectById(6L);
        System.out.println(bill3.getBillNum());

    }

    // 3 测试通用枚举
    @Test
    public void test3 (){
//        Bill bill = new Bill();
//        bill.setBillName("admin");
//        bill.setBillNum(33);
//        bill.setPay(SexEnum.ONE);  // 保存的是指是数值，并不是文字
//        int result = billMapper.insert(bill);
//        System.out.println("result:" + result);
    }

}
